﻿using ClosedXML.Report;
using ClosedXMLReportDemo.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClosedXMLReportDemo
{
    /// <summary>
    /// ClosedXMLReport     excel报表     支持net4.0+
    /// 添加引用：ClosedXML(0.95.0.0)、ClosedXML.Report(0.2.0.0)
    /// 可以将excel模板设置好数据规则，直接填入数据即可
    /// github:https://github.com/ClosedXML/ClosedXML.Report
    /// 缺点：
    ///     1.只能处理简单的数据插入，如果想要输出多个table表的话，则会麻烦一点，这点非常不友好。
    ///     2.输出表格table，需要指定excel一块区域，且把该区域设置名称为item。
    ///     3.不支持xls格式。只支持如下格式。'.xlsx', '.xlsm', '.xltx' and '.xltm'.
    /// 结论：
    ///     如果你只是处理一些简单的报表输出或只需要输出一张table表，还是可以使用的，毕竟比npoi输出简单多了，否则不建议使用
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            const string outputFile = @".\Output\report.xls";//输出目录
            var template = new XLTemplate(@".\Template\Student.xls");//模板目录

            Student stu = new Student
            {
                Age = 25,
                Id = 1,
                Name = "財政局",
            };
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic["Id"] = "1";
            dic["Age"] = "25";
            dic["Name"] = "財政局";


            //AddVariable(object)方法，可传入实体、字典
            {
                //template.AddVariable(stu);//传入单个实体

                template.AddVariable(dic);//传入字典
            }

            //AddVariable(string alias, object value)方法，可以传入集合、动态类型、DataTable。如果希望输出多个table表，建议传入集合
            //注意key值必须为item
            {
                IEnumerable<dynamic> CourseItems()
                {
                    return new List<dynamic>
                {
                    new { Id=1, Name="数学", Grade=89,Items=new { Id=1,Name="1"} },
                    new { Id=2, Name="英语", Grade=15,Items=new { Id=2,Name="2"} },
                    new { Id=3, Name="语文", Grade=100,Items=new { Id=3,Name="3"} },
                };
                }

                var Course = new List<Course>
                 {
                      new Course{ Id=1, Name="数学", Grade=89 , Items=new item{ Id=1,Name="1"}},
                      new Course{ Id=2, Name="英语", Grade=15, Items=new item{ Id=2,Name="2"}},
                      new Course{ Id=3, Name="语文", Grade=100, Items=new item{ Id=3,Name="3"}}
                 };
                DataTable dt = new DataTable();
                dt.Columns.Add("Id", typeof(int));
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("Grade", typeof(int));

                var newRow = dt.NewRow();
                newRow["Id"] = 1;
                newRow["Name"] = "数学";
                newRow["Grade"] = 89;
                dt.Rows.Add(newRow);
                newRow = dt.NewRow();
                newRow["Id"] = 2;
                newRow["Name"] = "英语";
                newRow["Grade"] = 15;
                dt.Rows.Add(newRow);
                newRow = dt.NewRow();
                newRow["Id"] = 3;
                newRow["Name"] = "语文";
                newRow["Grade"] = 100;
                dt.Rows.Add(newRow);


                //template.AddVariable("item", CourseItems());//动态类型
                template.AddVariable("item", Course);//集合
                //template.AddVariable("item", dt);//DataTable
            }

            template.Generate();

            template.SaveAs(outputFile);//输出excel文件

            //打开excel文件
            Process.Start(new ProcessStartInfo(outputFile) { UseShellExecute = true });
        }
    }
}
